gdk: Add a related_target field to some events
authorMatthias Clasen <mclasen@redhat.com>
Fri, 8 Mar 2019 16:12:30 +0000 (11:12 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Sun, 17 Mar 2019 01:24:45 +0000 (21:24 -0400)
Crossing and focus change events are emitted between
two widgets, and want to associate both with the
events.

gdk/gdkevents.c
gdk/gdkeventsprivate.h

index bacc1eb77744e161a907a3bbf18e44df34b63b49..d9e9af6eeff5b825abf5a54b934d785180ef2413 100644 (file)
@@ -573,6 +573,13 @@ gdk_event_copy (const GdkEvent *event)
     case GDK_LEAVE_NOTIFY:
       if (event->crossing.child_surface != NULL)
         g_object_ref (event->crossing.child_surface);
+      if (event->crossing.related_target)
+        g_object_ref (event->crossing.related_target);
+      break;
+
+    case GDK_FOCUS_CHANGE:
+      if (event->focus_change.related_target)
+        g_object_ref (event->focus_change.related_target);
       break;
 
     case GDK_DRAG_ENTER:
@@ -634,6 +641,11 @@ gdk_event_finalize (GObject *object)
     case GDK_ENTER_NOTIFY:
     case GDK_LEAVE_NOTIFY:
       g_clear_object (&event->crossing.child_surface);
+      g_clear_object (&event->crossing.related_target);
+      break;
+
+    case GDK_FOCUS_CHANGE:
+      g_clear_object (&event->focus_change.related_target);
       break;
 
     case GDK_DRAG_ENTER:
@@ -1916,6 +1928,29 @@ gdk_event_get_target (const GdkEvent *event)
   return event->any.target;
 }
 
+void
+gdk_event_set_related_target (GdkEvent *event,
+                              GObject  *target)
+{
+  if (event->any.type == GDK_ENTER_NOTIFY ||
+      event->any.type == GDK_LEAVE_NOTIFY)
+    g_set_object (&event->crossing.related_target, target);
+  else if (event->any.type == GDK_FOCUS_CHANGE)
+    g_set_object (&event->focus_change.related_target, target);
+}
+
+GObject *
+gdk_event_get_related_target (const GdkEvent *event)
+{
+  if (event->any.type == GDK_ENTER_NOTIFY ||
+      event->any.type == GDK_LEAVE_NOTIFY)
+    return event->crossing.related_target;
+  else if (event->any.type == GDK_FOCUS_CHANGE)
+    return event->focus_change.related_target;
+
+  return NULL;
+}
+
 /**
  * gdk_event_is_sent:
  * @event: a #GdkEvent
index f3ccd3d9f797e14885b8a7c3ffeb46132eb119de..2db43d9a828d44dc17053682b71464fbd330f95a 100644 (file)
@@ -303,6 +303,7 @@ struct _GdkEventCrossing
   GdkNotifyType detail;
   gboolean focus;
   guint state;
+  GObject *related_target;
 };
 
 /*
@@ -323,6 +324,7 @@ struct _GdkEventFocus
   gint16 in;
   GdkCrossingMode mode;
   GdkNotifyType detail;
+  GObject *related_target;
 };
 
 /*
@@ -639,6 +641,9 @@ union _GdkEvent
 void           gdk_event_set_target              (GdkEvent *event,
                                                   GObject  *user_data);
 GObject *      gdk_event_get_target              (const GdkEvent *event);
+void           gdk_event_set_related_target       (GdkEvent *event,
+                                                  GObject  *user_data);
+GObject *      gdk_event_get_related_target      (const GdkEvent *event);
 
 
 #endif /* __GDK_EVENTS_PRIVATE_H__ */